#ifndef __TOOL_H__
#define __TOOL_H__

#include <pthread.h>
#include "myprotocol.h"
#define MYPATH "/home/linux"

/**
 * @brief 创建守护进程
 * @param 无
 * @retval 无
 */
// 创建守护进程
void create_daemon(void);

/**
 * @brief 初始化信号灯
 * @param 空
 * @retval 0: 成功, -1: 失败
 */
int mysemlamp_init(void);

/**
 * @brief 网络初始化
 * @param 端口号
 * @retval 0: 成功, -1: 失败
 */
int net_init(const char *Tport);

/**
 * @brief 链表初始化
 * @param 头结点指针的地址
 * @retval 0: 成功, -1: 失败
 */
int list_create(list_t **head);

/**
 * @brief 初始化消息队列
 * @param 无
 * @retval 0: 成功, -1: 失败
 */
int msg_queue_init(void);

/**
 * @brief 插入节点 ( 采取了头插法 )
 * @param 头结点地址 fd 用户id( 否则web端无法知道对应ID的下位机是否在线 ) 线程tid
 * @retval 成功返回msgid 失败返回-1
 */
int list_insert(list_t *head, int fd, const char *id, pthread_t tid);

/**
 * @brief 查找对应id的节点是否存在
 * @param 头结点地址 用户id
 * @retval 0: 存在, -1: 不存在
 */
int list_find_by_id(list_t *head, const char *id);

/**
 * @brief 删除节点
 * @param 头结点地址
 * @retval 0: 成功, -1: 失败
 */
int list_delete(list_t *head, int fd);

/**
 * @brief 遍历链表 ( 查看下位机的心跳 ), 每x秒遍历一次 单个节点容忍度为y秒
 * @param 头结点地址
 * @retval 0: 成功, -1: 失败
 */
int list_traverse(list_t *head);

/**
 * @brief 释放链表
 * @param 头结点地址
 * @retval 0: 成功, -1: 失败
 */
int list_free(list_t **head);

/**
 * @brief 任务函数( 线程处理函数 )
 * @param 线程参数 ( 传递的是fd )
 * @retval 空
 */
void *handle_thread(void *arg);

/**
 * @brief 心跳检测任务函数( 线程处理函数 )
 * @param 线程参数 ( 传递的是head )
 * @retval 空
 */
void *heartbeat_thread(void *arg);

/**
 * @brief 监控硬件状态的函数( 线程处理函数 )
 * @param 线程参数
 * @retval 空
 */
void *monitor_hw_thread(void *arg);

#endif